package com.eric.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.server.HttpServerRequest;
import com.eric.domain.dto.SysUserDto;
import com.eric.domain.po.SysUser;
import com.eric.mapper.SysUserMapper;
import com.eric.service.UserLoginService;
import com.github.yulichang.base.MPJBaseServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class UserLoginServiceImpl extends MPJBaseServiceImpl<SysUserMapper, SysUser> implements UserLoginService {
    private  int loginCount=0;
    @Override
    public SaResult saveOneUser(SysUserDto sysUserDto, HttpServerRequest request) {
        if (StrUtil.hasBlank(sysUserDto.getLoginName())){
            return SaResult.error("用户名不能为空");
        }
        SysUser userDto = query().eq("loginName", sysUserDto.getLoginName()).one();
        if (BeanUtil.isEmpty(userDto)){
            String hashpw = BCrypt.hashpw(sysUserDto.getPassword(), BCrypt.gensalt());
            sysUserDto.setPassword(hashpw);
            SysUser user=new SysUser();
            BeanUtil.copyProperties(sysUserDto,user);
            boolean save = save(user);
            return SaResult.data(save);
        }
         return SaResult.error("用户已存在，请使用另外的登录名注册");
    }

    @Override
    public SaResult loginByPw(Map<String, String> loginObj) {
//        通过前端map对象获取到用户名和密码
        String loginName = loginObj.get("loginName");
        String pw = loginObj.get("password");
        if (StrUtil.hasBlank(loginName)){
            return SaResult.error("用户名有误，请重新输入");
        }
//        通过loginname获取数据库中一个user对象
        SysUser userBySelect = query().eq("loginName", loginName).one();
        if (BeanUtil.isEmpty(userBySelect)){
//            这里试试用跳转方式代替这个
            return SaResult.error("此用户名没有注册");
        }

//        程序员专用账号密码，没有加密
        if (loginObj.get("loginName").equals("code_deng")){
            if (loginObj.get("password").equals("Djydzt123*#")){

                //        执行saToken的登录行为，返回一个token到前端
                StpUtil.login(userBySelect.getId(),true);
                return SaResult.data(StpUtil.getTokenValue());
            }
            else {
                return SaResult.error("密码错误，请重新输入");
            }
        }


//        校验传进来的密码和数据库中存储的加密后密码是否一致
        boolean checkpw = BCrypt.checkpw(pw, userBySelect.getPassword());
        if (!checkpw){
//            限定可以错误多少次
            this.loginCount+=1;
            if (this.loginCount<=5){
                return SaResult.error("密码错误，请重新输入"+"(还可以输入"+(5-this.loginCount)+"次）");
            }
            else {
//                这里后续加入把账号禁止的逻辑-----SaToken的一个方法
                return SaResult.error("用户已被锁定");
            }
        }

        Integer id = userBySelect.getId();
        StpUtil.checkDisable(id);


//        执行saToken的登录行为，返回一个token到前端
        StpUtil.login(userBySelect.getId(),true);
        return SaResult.data(StpUtil.getTokenValue());
    }
}
